#include "main.h"
#include <stdio.h>
#include <stdint.h>
#include "my_uart_app.h"
#include "sys_param.h"



/******************************************************************************
* FunctionName : crc16_compute(uint8_t const * p_data, uint32_t size, uint16_t const * p_crc)
* Description : CRC校验
* EntryParameter : None
* ReturnValue : None
******************************************************************************/
uint16_t crc16_compute(uint8_t const * p_data, uint32_t size)
{
    uint16_t crc =0xFFFF;
		int i;
    for (i = 0; i < size; i++)
    {
        crc = (uint8_t)(crc >> 8) | (crc << 8);
        crc ^= p_data[i];
        crc ^= (uint8_t)(crc & 0xFF) >> 4;
        crc ^= (crc << 8) << 4;
        crc ^= ((crc & 0xFF) << 4) << 1;
    }
    return crc;
}

/********************************************
 * 获取底座连接状态
 * 
 ***********************************************/
uint8_t get_base_connect_flag(void)
{

    return  uart_data.base_connect_flag;
}

/********************************************
 * 串口超时判断
 * 
 ***********************************************/
void my_uart_timeout_checkout(void)
{
    uart_data.unrecv_timeout_cnt ++;

    if(uart_data.unrecv_timeout_cnt > MAX_TIMEOUT_CNT){
            uart_data.unrecv_timeout_cnt = 0;
            if(uart_data.base_connect_flag){
                uart_data.base_connect_flag = 0;
            }
    }
}

/********************************************
 * 老化模式下，状态发送
 * 0xee 0x08 0x00 0x0f 0x00 0x00 crc_h  crc_l   //  主机在停止输出，在充电状态
   0xee 0x08 0x00 0x0f 0x00 0x00  0x2b  0x97

   0xee 0x08 0x00 0x0f 0x00 0x01 crc_h  crc_l   //  主机在停止充电，在输出状态
   0xee 0x08 0x00 0x0f 0x00 0x01 0x3b 0xb6
 ***********************************************/
void send_aling_mode_sta(void)
{
    uint16_t crc;

    if(ALIGN_STA != get_sys_state()){
        return;
    }

    uart_data.tx_buff[0] = 0xee;
    uart_data.tx_buff[1] = 0x08;
    uart_data.tx_buff[2] = 0x00;
    uart_data.tx_buff[3] = 0x0f;    // 老化指令

    uart_data.tx_buff[4] = 0x00;   // 电池信息应答

    if(sys_data.aling_run_cnt > ALING_MODE_MAX_OUT_TIME){
        uart_data.tx_buff[5] = 0x00;    // 充电中
    }
    else{
        uart_data.tx_buff[5] = 0x01;    // 充电完毕     
    }

    crc = crc16_compute(uart_data.tx_buff, 6);

    uart_data.tx_buff[6] = crc>>8;
    uart_data.tx_buff[7] = crc&0xff;

    uartx_send_data(8);
}


/********************************************
 * 串口接收函数回调
 * 
 * 
 ***********************************************/
void my_uart_callback(void)
{
    uint16_t crc;
    int i;
    if(0 == uart_data.recv_flag){
        return;
    }

    uart_data.recv_flag = 0;
    if(uart_data.recv_num < 2){
        return;
    }
    if(0xff != uart_data.rx_buff[0]){
        //  printf("buff[%0x]  len[%d] \r\n", uart_data.rx_buff[0], uart_data.recv_num);
        uart_data.recv_num = 0;
        return;
    }

    crc = crc16_compute((uint8_t const *)uart_data.rx_buff, uart_data.recv_num - 2);
    if(crc != ((uart_data.rx_buff[uart_data.recv_num-2]<<8)|uart_data.rx_buff[uart_data.recv_num-1]))
    {
        return;
    }

    /********
     * 底座发过来的指令：ff 08 00 04 03 00 d1 11
     * 
     * 主机回复：
     *      充电中  ：0xee 0x08 0x00 0x04 0x04 0x01 0x07 0x83
     *      充电完毕：0xee 0x08 0x00 0x04 0x04 0x02 0x37 0xe0
     * 
     * */ 

    switch(uart_data.rx_buff[3])
    {
        case UART_BAT_CMD:{
            switch(uart_data.rx_buff[4]){
                case CHARGE_STA_REQ:{
                    uart_data.unrecv_timeout_cnt = 0;
                    uart_data.base_connect_flag = 1;
                    uart_data.tx_buff[0] = 0xee;
                    uart_data.tx_buff[1] = 0x08;
                    uart_data.tx_buff[2] = 0x00;
                    uart_data.tx_buff[3] = 0x04;    // 电池相关指令

                    uart_data.tx_buff[4] = 0x04;   // 电池信息应答

                    if(CHARGE_STA == get_sys_state()){
                        uart_data.tx_buff[5] = 0x01;    // 充电中
                    }
                    else{
                        uart_data.tx_buff[5] = 0x02;    // 充电完毕     
                    }

                    crc = crc16_compute(uart_data.tx_buff, 6);

                    uart_data.tx_buff[6] = crc>>8;
                    uart_data.tx_buff[7] = crc&0xff;

                    uartx_send_data(8);
                   // printf(" charge sta req \r\n ");
                   //
                    break;
                }
                default:{

                    break;
                }
            }
        }
        default:{

            break;
        }
    }
}

